<?php

class myGoogleAnalytics {

    /*
     * Anotaciones:
     * Cuando Practil manda al usuario a la página de autenticación de google al pedir los permisos:
     * Google autogenera un access_token y refresh_token. El access_token tiene un tiempo de vida de
     * 3600 segundos (1 hora), para efectos de utilización del API de google es necesario almacenar en
     * la BD el "refresh_token" brindado por google. Ya que este servirá para autorefrescar nuevos access_tokens
     * cada vez que sea necesario acceder al API.
     */

    public function getData($refresh_token, $account, $metrics, $date_from, $date_to, $max_results = "1"){
        $access_token = $this->useRefreshToken($refresh_token);
        $value = null;
        $postdata = http_build_query(
            array(
                'ids' => $account,
                'metrics' => $metrics,
                'start-date' => $date_from,
                'end-date' => $date_to,
                'max-results' => $max_results,
                'access_token' => $access_token
            )
        );
        $xml_string=file_get_contents("https://www.google.com/analytics/feeds/data"."?".$postdata);
        if($xml_string === FALSE){
            echo "Oops, algo se ha roto.";
        }else{
            $xml = simplexml_load_string($xml_string);
            if(isset($xml->entry)){
                $metrics = $xml->entry->xpath("dxp:metric");
                if($metrics[0]['value']!=''){
                    $value = $metrics[0]['value'];
                }else{
                    echo "El valor es vacío";
                }
            }else{
                echo "El dato que está solicitando no está disponible para este usuario";
            }
        }
        return $value;
    }

    public function getAccounts($access_token){
        $array_xml = array();
        $postdata = http_build_query(
            array(
                'start-index' => '1',
                'max-results' => '50',
                'v' => '2',
                'prettyprint' => 'true',
                'access_token' => $access_token
            )
        );
        $xml_string=@file_get_contents("https://www.google.com/analytics/feeds/accounts/default"."?".$postdata);
        if($xml_string === FALSE){
            echo "Oops, algo se ha roto.";
        }else{
            $xml = simplexml_load_string($xml_string);
            foreach($xml->entry as $entry){
                $row = $entry->xpath("dxp:tableId");
                $array_xml[] = array(
                                "id"=>strval($row[0]),
                                "name"=>strval($entry->title)
                            );
            }
        }
        return $array_xml;
    }

    public function saveRefreshToken($user, $refresh_token){
        $c = new Criteria();
        //graba el refresh token del usuario en algun lugar para luego utilizarlo para generar mas access_tokens
        if($refresh_token!=""){
            $c->clear();
            $c->add(UserGooglePeer::USER_ID, $user->getId());
            $user_google = UserGooglePeer::doSelectOne($c);
            if(!is_object($user_google)){
                $user_google = new UserGoogle();
            }
            $user_google->setRefreshToken($refresh_token);
            $user_google->setUserId($user->getId());
            $user_google->save();
        }
    }

    public function getSavedRefreshToken($user){
        $c = new Criteria();
        $c->add(UserGooglePeer::USER_ID, $user->getId());
        $user_google = UserGooglePeer::doSelectOne($c);
        if(!is_object($user_google)){
            echo "Error";
        }
        return $user_google->getRefreshToken();
    }

    /*
     * Utiliza el refresh token del usuario para generar un access_token nuevo
     */
    public function useRefreshToken($refresh_token){
        $access_token = null;
        $postdata = http_build_query(
            array(
                'client_id' => "1011069716462-0pm1q6qkfquftbk4mtt759tollfq8plj.apps.googleusercontent.com",
                'client_secret' => "kyvRmFCcRbE3yKLRcXI8lyQx",
                'refresh_token' => $refresh_token,
                'grant_type' => 'refresh_token'
            )
        );
        $opts = array('http' =>
            array(
                'method'  => 'POST',
                'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
                'content' => $postdata
            )
        );
        $context  = stream_context_create($opts);
        $result = @file_get_contents('https://accounts.google.com/o/oauth2/token', false, $context);
        if($result === FALSE){
            echo "Oops, algo se ha roto. (useRefreshToken)";
        }else{
            $json = json_decode($result);
            $access_token = $json->{'access_token'};
        }
        return $access_token;
    }

}
?>